var morgan = require('morgan');
var { sunnyLogApi } = require('@Sequelize')
Date.prototype.Format = function (fmt) { //author: meizz 
  var o = {
    "M+": this.getMonth() + 1, //月份 
    "d+": this.getDate(), //日 
    "h+": this.getHours(), //小时 
    "m+": this.getMinutes(), //分 
    "s+": this.getSeconds(), //秒 
    "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
    "S": this.getMilliseconds() //毫秒 
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}

/*
获取本机IP
*/

// for (const key in sunnyLogApi.tableAttributes) {
//   if (Object.hasOwnProperty.call(sunnyLogApi.tableAttributes, key)) {
//     const element = sunnyLogApi.tableAttributes[key];
//   }
// }

// id tenantId serviceId serverHost serverIp env type title method requestUri userAgent remoteIp methodClass methodName params time createBy createTime updateTime

// format：可选，morgan与定义了几种日志格式，每种格式都有对应的名称，比如combined short 等，默认是default。不同格式的差别可参考这里。下文会讲解下，如果自定义日志格式。
// options：可选，配置项，包含stream（常用）、skip、immediate。
// stream：日志的输出流配置，默认是process.stdout。
// skip：是否跳过日志记录，使用方式可以参考这里。
// immediate：布尔值，默认是false。当为true时，一收到请求，就记录日志；如果为false，则在请求返回后，再记录日志。const morganImmediate = false
var morganFormat = 'combined'
var morganOptions = {
  skip: function (req, res){
    if(req.originalUrl.indexOf("swagger")!=-1){
      return true
    }
    if(req.originalUrl.indexOf("favicon.ico")!=-1){
      return true
    }
    return res.morganSkip
  },
  stream: {
    write: function (line) {
      line = JSON.parse(line.replace(/\n/, ""))
      sunnyLogApi.create(line)
    }
  }
};
morgan.token('tenantId', function (req, res) {
  return 'tenantId';
});
morgan.token('serviceId', function (req, res) {
  return 'serviceId';
});
morgan.token('serverIp', function (req, res) {
  return '127.0.0.1';
});
morgan.token('params', function (req, res) {
  return req.url;
});
morgan.token('requestUrl', function (req, res) {
  return 'requestUrl';
});
morgan.token('serverHost', function (req, res) {
  return 'serverHost';
});
morgan.token('ip', function (req, res) {
  return req.ip;
});
morgan.token('time', function (req, res) { 
  return new Date().Format("yyyy-MM-dd hh:mm:ss");
});
morgan.token('createBy', function (req, res) { 
  return ''; 
});
var formatStr = `{
  "remoteAddr":":remote-addr",
  "remoteUser":":remote-user",
  "ip":":ip",
  "method": ":method",
  "serverIp": ":serverIp",
  "requestUrl":":url",
  "params":":params",
  "userAgent":":user-agent",
  "time": ":response-time[4]",
  "tenantId":":tenantId",
  "serviceId":":serviceId",
  "serverHost":":serverHost",
  "remoteUser":":remote-user"
}`
morgan.format(morganFormat, formatStr);
var morganMiddleware = morgan(morganFormat, morganOptions)

module.exports = {
  morgan,
  morganFormat,
  morganOptions,
  morganMiddleware,
}